package org.gwc.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import javax.sql.DataSource;

/**
 * 方式1：保留外部配置文件
 *    问题：如果将dataSource和mybatis的组件配置到一起，会发生@Value注解不生效的问题
 *    原因：mybatis的组件优先加载，@Value还没有读取
 *    解决：分开配置,写到不同的类即可
 */

@Configuration
public class MapperJavaConfig {

    /**
     * sqlSessionFactory加入ioc容器
     * mybatis -> sqlSessionFactory[ioc] -> getObject() -> sqlSessionFactory
     * 方式1：外部指定mybatis-config.xml [mybatis的配置 除了 连接池 mapper指定]
     *
     * 问题： 如果将dataSource和mybatis的组件配置到一起，会出现@value注解不生效的问题
     * 原因: mybatis的组件优先加载，@value还没有读取
     * 解决： 分开配置，写到不同的类即可
     */
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        //指定数据库连接池对象
        sqlSessionFactoryBean.setDataSource(dataSource);
        //指定外部的mybatis配置文件
        // spring.core 包
        Resource resource = new ClassPathResource("nybatis-config.xml");
        sqlSessionFactoryBean.setConfigLocation(resource);
        return sqlSessionFactoryBean;
    }

    // mapper 代理对象加入到ioc, 不懂这里是怎么跟sqlSessionFactoryBean 进行关联的
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        // mapper 代理兑现的factoryBean->指定一个包->mapper接口->sqlSessionFactory->sqlSession->getMapper->mapper代理对象->ioc
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("org.gwc.mapper"); // mapper接口和mapperxml所在的共同包
        return mapperScannerConfigurer;
    }

}
